package proto

import (
	"fmt"
	"regexp"
	D "websocket_apn/define"
	"websocket_apn/log"
)

// 获取装备对应索引
func GetEquipmentPartIdx(data []byte) int {
	idx := -1
	if len(data) == 0 {
		return idx
	}
	if data[1] == 0x4E && data[0] >= 0x91 && data[0] <= 0xF4 {
		idx = 0 //"武器"
	} else if (data[1] == 0x4E && data[0] >= 0xF5) || (data[1] == 0x4F && data[0] <= 0xD8) {
		idx = 1 //"头部"
	} else if (data[1] == 0x4F && data[0] >= 0xD9) || (data[1] == 0x50 && data[0] <= 0xBC) {
		idx = 2 //"衣服"
	} else if (data[1] == 0x50 && data[0] >= 0xBD) || (data[1] == 0x51 && data[0] <= 0xA0) {
		idx = 3 //"鞋履"
	} else if (data[1] == 0x51 && data[0] >= 0xA1) || (data[1] == 0x52 && data[0] <= 0x84) {
		idx = 4 //"项圈"
	} else if data[1] == 0x52 && data[0] >= 0x85 && data[0] <= 0xE8 {
		idx = 5 //"腰带"
	} else if (data[1] == 0x52 && data[0] >= 0xE9) || (data[1] == 0x53 && data[0] <= 0xCC) {
		idx = 6 //"护腕"
	} else if (data[1] == 0x53 && data[0] >= 0xCD) || (data[1] == 0x54 && data[0] <= 0xB0) {
		idx = 7 //"宝珠"
	} else if (data[1] == 0x54 && data[0] >= 0xB1) || (data[1] == 0x55 && data[0] <= 0x94) {
		idx = 8 //"法器"
	} else if data[1] == 0x55 && data[0] >= 0x95 && data[0] <= 0xF8 {
		idx = 9 //"秘宝"
	} else if (data[1] == 0x55 && data[0] >= 0xF9) || (data[1] == 0x56 && data[0] <= 0xDC) {
		idx = 10 //"信物"
	} else if data[1] == 0x56 && data[0] >= 0xDD || (data[1] == 0x57 && data[0] <= 0xFF) {
		idx = 11 //"傀儡"
	}
	return idx
}

// 获取装备部位名称
func GetEquipmentPartName(data []byte) string {
	idx := GetEquipmentPartIdx(data)
	if idx < 0 {
		return "未知"
	}
	return D.EquipmentPartName[idx]
}

// 获取装备属性描述
func GetEquipmentAttrDesc(idx int, val int64) string {
	str := ""
	switch idx {
	case D.Equipment_Data_Attack:
		str += fmt.Sprintf(" 攻击:%s", D.GetCombatValueDesc(val))
		break
	case D.Equipment_Data_Life:
		str += fmt.Sprintf(" 生命:%s", D.GetCombatValueDesc(val))
		break
	case D.Equipment_Data_Defense:
		str += fmt.Sprintf(" 防御:%s", D.GetCombatValueDesc(val))
		break
	case D.Equipment_Data_Agile:
		str += fmt.Sprintf(" 敏捷:%s", D.GetCombatValueDesc(val))
		break
	case D.Equipment_Attribute_Stun:
		str += fmt.Sprintf(" 击晕:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Critical_Strike:
		str += fmt.Sprintf(" 暴击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Combo_Sttack:
		str += fmt.Sprintf(" 连击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Dodge:
		str += fmt.Sprintf(" 闪避:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Counter_Attack:
		str += fmt.Sprintf(" 反击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Blood_Suck:
		str += fmt.Sprintf(" 吸血:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Stun:
		str += fmt.Sprintf(" 抗击晕:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Critical_Strike:
		str += fmt.Sprintf(" 抗暴击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Combo_Sttack:
		str += fmt.Sprintf(" 抗连击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Dodge:
		str += fmt.Sprintf(" 抗闪避:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Counter_Attack:
		str += fmt.Sprintf(" 抗反击:%.1f%%", float32(val)/10)
		break
	case D.Equipment_Attribute_Anti_Blood_Suck:
		str += fmt.Sprintf(" 抗吸血:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Final_Increase_Damage:
		str += fmt.Sprintf(" 最终增伤:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Final_Reduction_Damage:
		str += fmt.Sprintf(" 最终减伤:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Enhanced_Critical_Damage:
		str += fmt.Sprintf(" 强化暴伤:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Critical_Damage:
		str += fmt.Sprintf(" 弱化暴伤:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Enhanced_Treatment:
		str += fmt.Sprintf(" 强化治疗:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Treatment:
		str += fmt.Sprintf(" 弱化治疗:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Enhanced_Spirit_Beast:
		str += fmt.Sprintf(" 强化灵兽:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Spirit_Beast:
		str += fmt.Sprintf(" 弱化灵兽:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Enhanced_Taoist_Damage:
		str += fmt.Sprintf(" 强化道法伤害:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Ignoring_Combat_Attr:
		str += fmt.Sprintf(" 无视战斗属性:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Ignoring_Combat_Resistance:
		str += fmt.Sprintf(" 无视战斗抗性:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Taoist_Damage:
		str += fmt.Sprintf(" 弱化道法伤害:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Grid:
		str += fmt.Sprintf(" 格挡:%s", D.GetCombatValueDesc(val))
		break
	case D.Special_Attributes_Anti_Grid:
		str += fmt.Sprintf(" 抗格挡:%s", D.GetCombatValueDesc(val))
		break
	case D.Special_Attributes_Armor_Penetration:
		str += fmt.Sprintf(" 破甲:%s", D.GetCombatValueDesc(val))
		break
	case D.Special_Attributes_Anti_Armor_Penetration:
		str += fmt.Sprintf(" 抗破甲:%s", D.GetCombatValueDesc(val))
		break
	case D.Special_Attributes_Shield:
		str += fmt.Sprintf(" 护盾:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Shield:
		str += fmt.Sprintf(" 弱化护盾:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Daofa_Combo:
		str += fmt.Sprintf(" 道法连击:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Anti_Daofa_Combo:
		str += fmt.Sprintf(" 抗道法连击:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Spirit_Beast_Suppression:
		str += fmt.Sprintf(" 灵兽压制:%d", val)
		break
	case D.Special_Attributes_Anti_Spirit_Beast_Suppression:
		str += fmt.Sprintf(" 抗灵兽压制:%d", val)
		break
	case D.Special_Attributes_Spirit_Beast_Inspiration:
		str += fmt.Sprintf(" 灵兽鼓舞:%d", val)
		break
	case D.Special_Attributes_Anti_Spirit_Beast_Inspiration:
		str += fmt.Sprintf(" 抗灵兽鼓舞:%d", val)
		break
	case D.Special_Attributes_Enhanced_Xuanjue:
		str += fmt.Sprintf(" 强化玄诀:%.1f%%", float32(val)/10)
		break
	case D.Special_Attributes_Weak_Xuanjue:
		str += fmt.Sprintf(" 弱化玄诀:%.1f%%", float32(val)/10)
		break
	default:
		str += fmt.Sprintf(" %02d: %-8d", idx, val)
		break
	}
	return str
}

// 获取装备所有信息描述
func GetEquipmentInfoDesc(info D.EquipmentInfo) string {
	str := fmt.Sprintf(" ID[%s] %d级 %s(%s) %s", info.Id, info.Level,
		GetEquipmentPartName(info.Part), BytesToHexStr(info.Part), D.EquipmentGrade[info.Grade])
	if info.CombatValue > 0 {
		str += fmt.Sprintf(" 妖力%s", D.GetCombatValueDesc(info.CombatValue))
	}
	for idx := 0; idx < 20; idx++ {
		if _, ok := info.Data2A[idx]; ok {
			data := info.Data2A[idx]
			str += GetEquipmentAttrDesc(idx, data.Litter)
		}
	}
	return str
}
func ParaEquipmentAttrData(hex string, data *D.EquipmentInfo) {
	if len(hex) == 0 {
		return
	}
	//                            1 属性部位              2 属性类型                 3 属性值
	re := regexp.MustCompile(`(12|2A)[0-9A-F]{2}08([0-9A-F]{2})12[0-9A-F]{2}((?:3[0-9])+)`)
	res := re.FindAllStringSubmatch(hex, -1)
	if len(res) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res {
		info := D.EquipmentData{
			Litter: HexDataStrToInt64(regRes[3]),
		}
		if regRes[1] == "2A" {
			data.Data2A[int(OneByteHexStrToByte(regRes[2]))] = info
		} else {
			data.Data12[int(OneByteHexStrToByte(regRes[2]))] = info
		}
	}
}
func ParaUnDealEquipmentRsp(dataBytes []byte) D.EquipmentInfo {
	info := D.EquipmentInfo{
		DealFlag: true,
	}
	info.Data2A = make(map[int]D.EquipmentData, 0)
	info.Data12 = make(map[int]D.EquipmentData, 0)
	data := BytesToHexStr(dataBytes)
	//                                               1 分身ID             2 12装备数据                                            3 妖力值
	re0 := regexp.MustCompile(`22[0-9A-F]{4}08(0[012])((?:12[0-9A-F]{2}08[0-9A-F]{2}12[0-9A-F]{2}(?:3[0-9])+)+)1A[0-9A-F]{2}((?:3[0-9])+)`)
	res0 := re0.FindAllStringSubmatch(data, -1)
	if len(res0) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res0 {
		idx := int(OneByteHexStrToByte(regRes[1]))      //装备的ID号
		info.Combat[idx] = HexDataStrToInt64(regRes[3]) //妖力
	}
	//                                                          1 装备的ID号             2 装备部位          3 装备等级              4 装备品级                    5 2A装备数据                                          6 res            7 12装备数据                                                                   8 妖力值
	re := regexp.MustCompile(`12(?:[0-9A-F]{2}){1,3}0A[0-9A-F]{2}08((?:[0-9A-F]{2}){1,4})10([0-9A-F]{4})18((?:[0-9A-F]{2}){1,2})20((?:[0-9A-F]{2}){1,2})((?:2A[0-9A-F]{2}08[0-9A-F]{2}12[0-9A-F]{2}(?:3[0-9])+)+)30([0-9A-F]{2})((?:12[0-9A-F]{2}08[0-9A-F]{2}12[0-9A-F]{2}(?:3[0-9])+)+)1A[0-9A-F]{2}((?:3[0-9])+)`) //1A[0-9A-F]{2}38((?:3[0-9])+)
	res := re.FindAllStringSubmatch(data, -1)
	if len(res) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res {
		info.Id = regRes[1] //装备的ID号
		part, _ := HexStrToBytes(regRes[2])
		info.Part = part                                //装备部位
		info.Level = ParaIntDataByHexStr(regRes[3])     //装备等级
		info.Grade = OneByteHexStrToByte(regRes[4])     //装备品级
		ParaEquipmentAttrData(regRes[5], &info)         //2A装备数据
		ParaEquipmentAttrData(regRes[7], &info)         //12装备数据
		info.CombatValue = HexDataStrToInt64(regRes[8]) //妖力
		//log.Debugf("%#v", regRes[1:])
		//log.Infof(" %s", GetEquipmentInfoDesc(info))
		break
	}
	return info
}

func ParaCurrentEquipmentInfo(dataBytes []byte) D.CurrentEquipmentInfo {
	var info D.CurrentEquipmentInfo
	data := BytesToHexStr(dataBytes)
	//当前角色属性                                    1 属性类型                2 属性值
	re0 := regexp.MustCompile(`22[0-9A-F]{2}08([0-9A-F]{2})12[0-9A-F]{2}((?:3[0-9])+)`)
	res0 := re0.FindAllStringSubmatch(data, -1)
	if len(res0) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res0 {
		info.Attr[int(OneByteHexStrToByte(regRes[1]))] = HexDataStrToInt64(regRes[2])
	}
	//当前角色妖力                                    1 未知                 2 当前装备妖力
	re1 := regexp.MustCompile(`12[0-9A-F]{2}((?:3[0-9])+)1A[0-9A-F]{2}((?:3[0-9])+)`)
	res1 := re1.FindAllStringSubmatch(data, -1)
	if len(res1) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res1 {
		info.CombatValue = HexDataStrToInt64(regRes[2])
		break
	}
	//当前装备位置                       1 装备                2 属性值
	re2 := regexp.MustCompile(`30(0[0-3])38([0-9A-F]{2})40([0-9A-F]{2})48([0-9A-F]{2})`)
	res2 := re2.FindAllStringSubmatch(data, -1)
	if len(res2) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res2 {
		info.CloneFlag = true
		info.CloneIdx = int(OneByteHexStrToByte(regRes[1]))
		break
	}
	//当前装备属性                                    1 装备的ID号             2 装备部位          3 装备等级             4 装备品级       5 装备主属性                                              6 保留
	re := regexp.MustCompile(`2A[0-9A-F]{2}08((?:[0-9A-F]{2}){1,5})10([0-9A-F]{4})18((?:[0-9A-F]{2}){1,2})20([0-9A-F]{2})((?:2A[0-9A-F]{2}08[0-9A-F]{2}12[0-9A-F]{2}(?:3[0-9])+)+)30(0[0-9])`)
	res := re.FindAllStringSubmatch(data, -1)
	if len(res) == 0 {
		log.Errorf("解析数据失败-%s", data)
	}
	for _, regRes := range res {
		eInfo := D.EquipmentInfo{
			Id:    regRes[1],                      //装备的ID号
			Level: ParaIntDataByHexStr(regRes[3]), //装备等级
			Grade: OneByteHexStrToByte(regRes[4]), //装备品级
		}
		part, _ := HexStrToBytes(regRes[2])
		eInfo.Part = part //装备部位
		eInfo.Data2A = make(map[int]D.EquipmentData, 0)
		eInfo.Data12 = make(map[int]D.EquipmentData, 0)
		partIdx := GetEquipmentPartIdx(eInfo.Part)
		if partIdx >= 0 {
			ParaEquipmentAttrData(regRes[5], &eInfo) //2A装备数据
			info.Equipment[partIdx] = eInfo
		} else {
			log.Errorf("未知的装备 %s", GetEquipmentInfoDesc(eInfo))
		}
		//log.Debugf("%s", GetEquipmentInfoDesc(eInfo))
	}
	info.Flag = true
	return info
}

/*
获取玩家信息
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  193]:   MessageID: ↑↑↑↑↑ Client.467
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  197]:   S_GET_PLAYER_DETAIL_DATA - id:3109673861602
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  198]:   PayloadBytes: 71 AB 00 00 00 1E 00 00 4E 8D 00 00 02D4 07 01 81 E2 08 F6 D0 93 A7 C0 5A 10 86 E6 BD 01
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  195]:   MessageID: ↓↓↓↓↓ Server.468
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  197]:   game cmd[109]-unkown - id:3109673861602
[DEBUG] [2024/05/13 14:19:04] [src/websocket_apn/main_test.go]:[  198]:   PayloadBytes: 71 AB 00 00 0D 47 00 00 00 6D 00 00 02D4 07 01 81 E2 08 00 12 B0 1A 0A 6E 08 F6 D0 93 A7 C0 5A 10 C1 CA 08 1A 0F E9 9B AA E6 9C 88 E3 80 81 E5 A4 A7 E5 B8 9D 20 95 03 28 A3 DD 99 8A 02 32 2A 08 88 BD F4 EB 73 10 CC BF 28 18 E3 B6 0D 22 09 E6 98 A0 E6 98 9F E5 B1 B1 28 00 30 1338 86 E6 BD 01 40 2C 48 04 50 00 58 00 38 AB E5 08 40 86 E6 BD 01 4A 00 50 00 5A 06 E5 B9 BF E4 B8 9C 60 DF F4 08 68 00 70 00 12 04 08 27 10 00 12 05 08 06 10 DF 09 12 04 08 14 10 00 12 05 08 25 10 83 0C 12 05 08 09 10 9A 1D 12 04 08 28 1000 12 07 08 01 10 EA 98 AF 0F 12 05 08 20 10 DF 01 12 05 08 0D 10 81 10 12 05 08 04 10 BC 5C 12 04 08 18 10 62 12 04 08 22 10 00 12 04 08 29 10 00 12 05 08 0C 10 C8 12 12 04 08 1E 10 00 12 05 08 08 10 85 08 12 04 08 2F 10 00 12 05 08 0F 10AF 10 12 05 08 0B 10 EE 13 12 05 08 23 10 84 08 12 04 08 11 10 00 12 05 08 17 10 CE 01 12 05 08 26 10 C6 08 12 05 08 0A 10 84 07 12 04 08 2A 10 00 12 04 08 2E 10 00 12 04 08 12 10 00 12 05 08 15 10 CF 01 12 05 08 0E 10 F9 14 12 05 0824 10 F7 08 12 05 08 19 10 C2 01 12 05 08 1B 10 D5 08 12 04 08 21 10 00 12 05 08 1A 10 96 01 12 05 08 07 10 AD 09 12 05 08 05 10 D6 09 12 04 08 2D 10 00 12 04 08 2B 10 00 12 04 08 1D 10 00 12 05 08 1C 10 D8 02 12 07 08 03 10 95 91 A9 02 1204 08 1F 10 00 12 08 08 02 10 B7 EC 85 8D 01 12 04 08 13 10 00 12 04 08 2C 10 00 12 05 08 16 10 A3 04 12 05 08 10 10 D4 0E 1A 3B 08 9E 8F 0C 10 9B 4E 18 95 03 20 0B 2A 05 08 09 10 A7 01 2A 06 08 03 10 B3 8A 0C 2A 04 08 0D 10 53 2A 07 08 0210 FF BC D3 03 2A 05 08 04 10 AE 04 2A 06 08 01 10 9C FE 47 30 01 1A 3A 08 94 F7 0B 10 FE 4E 18 93 03 20 0A 2A 04 08 09 10 47 2A 06 08 03 10 D2 D4 0A 2A 07 08 02 10 A2 D1 CD 03 2A 05 08 04 10 FD 03 2A 06 08 01 10 E5 9B 45 2A 04 08 0E 10 2830 01 1A 3B 08 D9 F6 0B 10 E5 4F 18 93 03 20 0D 2A 05 08 09 10 BB 01 2A 06 08 03 10 E1 D0 07 2A 07 08 02 10 FA 80 C5 02 2A 05 08 04 10 81 03 2A 06 08 01 10 AD AE 31 2A 04 08 10 10 64 30 01 1A 3B 08 91 F7 0B 10 C7 50 18 92 03 20 0B 2A 05 08 09 10 B6 01 2A 06 08 03 10 96 D6 07 2A 07 08 02 10 C3 B6 B9 02 2A 05 08 04 10 F5 02 2A 06 08 01 10 A2 FE 2C 2A 04 08 0B 10 5A 30 01 1A 3B 08 A885 0C 10 AB 51 18 94 03 20 0B 2A 05 08 09 10 8F 01 2A 06 08 03 10 A7 84 0C 2A 07 08 02 10 CA A3 DA 03 2A 05 08 04 10 A8 04 2A 06 08 01 10 DA A1 47 2A 04 08 0E 10 4C 30 01 1A 3A 08 DA 8E 0C 10 8F 52 18 95 03 20 0B 2A 04 08 09 10 5A 2A 06 0803 10 CB E0 0B 2A 04 08 0C 10 28 2A 07 08 02 10 8B BC C5 03 2A 05 08 04 10 B3 04 2A 06 08 01 10 DC 94 49 30 01 1A 3B 08 AD F5 0B 10 F4 52 18 92 03 20 0C 2A 05 08 09 10 F9 01 2A 06 08 03 10 BE BE 05 2A 07 08 02 10 A5 B8 E5 01 2A 05 08 04 1090 02 2A 06 08 01 10 9C D4 22 2A 04 08 0B 10 77 30 01 1A 3B 08 83 FC 0B 10 D8 53 18 94 03 20 0C 2A 05 08 09 10 F7 01 2A 06 08 03 10 AB 88 06 2A 04 08 0D 10 6E 2A 07 08 02 10 A8 FD F7 01 2A 05 08 04 10 93 02 2A 06 08 01 10 EB 8E 24 30 01 1A3B 08 8D 88 0C 10 BB 54 18 95 03 20 0B 2A 05 08 09 10 AF 01 2A 06 08 03 10 80 A0 06 2A 04 08 0C 10 69 2A 07 08 02 10 96 E4 F5 01 2A 05 08 04 10 FE 01 2A 06 08 01 10 AE CB 25 30 01 1A 3B 08 93 8B 0C 10 9F 55 18 94 03 20 0B 2A 05 08 09 10 C0 01 2A 06 08 03 10 80 87 06 2A 07 08 02 10 DD E4 F0 01 2A 05 08 04 10 85 02 2A 06 08 01 10 DB F4 23 2A 04 08 0E 10 5A 30 01 1A 3B 08 E8 C6 0B 1083 56 18 8C 03 20 0B 2A 05 08 09 10 B5 01 2A 06 08 03 10 D6 F7 06 2A 07 08 02 10 A6 9C 86 02 2A 05 08 04 10 EE 02 2A 06 08 01 10 83 97 29 2A 04 08 0F 10 55 30 01 1A 3B 08 E0 86 0C 10 E7 56 18 95 03 20 0B 2A 05 08 09 10 A0 01 2A 06 08 03 1092 A9 08 2A 07 08 02 10 AF 80 CC 02 2A 05 08 04 10 F6 02 2A 06 08 01 10 B1 F7 2D 2A 04 08 0B 10 53 30 01 22 0B 08 93 4E 10 06 18 82 01 20 9A 4E 2A 43 08 4A 10 D1 FA 06 18 61 20 0D 2A 06 08 A6 BF 05 10 05 2A 06 08 9B BF 05 10 03 2A 06 08 D2BF 05 10 02 2A 06 08 A1 BF 05 10 06 30 31 38 BC 82 07 50 02 58 01 60 00 68 00 70 00 80 01 01 90 01 00 98 01 01 32 DB 03 0A 24 08 01 10 99 4E 18 18 20 09 2A 04 08 0C 10 51 2A 05 08 01 10 FB 2E 2A 04 08 0F 10 57 2A 04 08 0B 10 51 30 00 0A 2408 02 10 A2 4E 18 18 20 08 2A 04 08 0C 10 44 2A 05 08 07 10 DF 01 2A 04 08 0F 10 48 2A 04 08 10 10 47 30 00 0A 28 08 03 10 AC 4E 18 1A 20 08 2A06 08 02 10 88 9C 03 2A 05 08 04 10 97 07 2A 04 08 0F 10 45 2A 04 08 0B 10 48 30 D2 86 03 0A 24 08 04 10 B7 4E 18 1A 20 09 2A 04 08 0C 10 57 2A 05 08 05 10 FA 01 2A 04 08 0F 10 50 2A 04 08 0B 10 4F 30 00 0A 27 08 05 10 BE 4E 18 18 20 06 2A04 08 0C 10 2D 2A 06 08 02 10 F2 82 02 2A 04 08 0F 10 2E 2A 04 08 0B 10 2F 30 D2 86 03 0A 24 08 06 10 CB 4E 18 1A 20 09 2A 05 08 09 10 F6 01 2A 04 08 0C 10 56 2A 04 08 0B 10 52 2A 04 08 0E 10 4F 30 00 0A 24 08 07 10 D3 4E 18 17 20 07 2A 0508 01 10 9D 21 2A 04 08 0F 10 39 2A 04 08 0B 10 3E 2A 04 08 0E 10 39 30 00 0A 24 08 08 10 DE 4E 18 18 20 08 2A 04 08 0D 10 46 2A 05 08 06 10 E5 01 2A 04 08 0B 10 49 2A 04 08 0E 10 4A 30 00 0A 26 08 09 10 E7 4E 18 19 20 07 2A 05 08 03 10 AD08 2A 04 08 0C 10 39 2A 04 08 0F 10 3D 2A 04 08 0B 10 3E 30 D2 86 03 0A 24 08 0A 10 F2 4E 18 1A 20 08 2A 04 08 0D 10 45 2A 04 08 0C 10 4A 2A 05 08 08 10 EC 01 2A 04 08 10 10 45 30 00 0A 26 08 0B 10 F9 4E 18 18 20 05 2A 05 08 03 10 FB 05 2A 04 08 0D 10 24 2A 04 08 0C 10 23 2A 04 08 0B 10 23 30 D2 86 03 0A 24 08 0C 10 86 4F 18 17 20 08 2A 04 08 0D 10 49 2A 05 08 0A 10 E1 01 2A 04 080E 10 46 2A 04 08 10 10 46 30 00 10 19 18 D6 0C 28 C0 0D 3A 08 08 CB D0 07 10 03 18 00 3A 08 08 E8 C8 07 10 08 18 00 3A 08 08 E5 C8 07 10 06 18 00 42 0F 08 95 0A 10 63 18 05 20 D1 80 0B 20 D1 80 0B 42 0B 08 9A 11 10 1F 18 0D 20 99 82 0B 420F 08 C8 1A 10 32 18 02 20 E1 83 0B 20 C6 84 0B 42 0F 08 CD 21 10 55 18 05 20 8D 86 0B 20 8D 86 0B 48 37 48 37 48 37 48 37 48 37 48 37 48 37 48 37 48 37 48 37 48 37 48 37 50 09 5A 88 07 0A 09 08 91 4E 10 04 18 0B 20 05 0A 09 08 92 4E 10 0418 0C 20 05 0A 09 08 93 4E 10 03 18 01 20 05 0A 09 08 94 4E 10 03 18 0B 20 05 0A 09 08 95 4E 10 02 18 0B 20 05 0A 09 08 96 4E 10 03 18 0B 20 05 0A 09 08 97 4E 10 02 18 0A 20 02 0A 09 08 98 4E 10 03 18 0B 20 02 0A 09 08 99 4E 10 04 18 04 2002 0A 09 08 9A 4E 10 04 18 01 20 14 0A 09 08 9B 4E 10 03 18 02 20 14 0A 09 08 9C 4E 10 02 18 01 20 14 0A 09 08 9D 4E 10 04 18 02 20 0A 0A 09 08 9E 4E 10 04 18 03 20 0A 0A 09 08 9F 4E 10 03 18 01 20 0A 0A 09 08 A0 4E 10 01 18 01 20 0A 0A 09 08 A1 4E 10 03 18 01 20 0A 0A 0A 08 A1 9C 01 10 03 18 0B 20 0A 0A 09 08 A2 4E 10 04 18 02 20 0A 0A 0A 08 A2 9C 01 10 01 18 0B 20 0A 0A 0A 08 A39C 01 10 02 18 0B 20 0A 0A 09 08 A3 4E 10 03 18 06 20 0A 0A 09 08 A4 4E 10 03 18 01 20 0A 0A 0A 08 A4 9C 01 10 02 18 0B 20 0A 0A 0A 08 A5 9C 01 10 02 18 0C 20 0A 0A 0A 08 A6 9C 01 10 01 18 01 20 0A 0A 0A 08 A7 9C 01 10 01 18 01 20 03 0A 0A08 A9 9C 01 10 01 18 0B 20 03 0A 0A 08 AB 9C 01 10 01 18 0B 20 1E 0A 0A 08 AF 9C 01 10 02 18 05 20 14 0A 0A 08 B0 9C 01 10 01 18 0B 20 14 0A 0A 08 B1 9C 01 10 01 18 02 20 14 0A 0A 08 B3 9C 01 10 02 18 01 20 03 0A 0A 08 B4 9C 01 10 01 18 0120 01 0A 0A 08 B5 9C 01 10 01 18 01 20 03 0A 0A 08 B6 9C 01 10 01 18 0B 20 0A 0A 0A 08 B7 9C 01 10 01 18 01 20 0A 0A 0A 08 B7 EA 01 10 01 18 06 20 00 0A 0A 08 B9 9C 01 10 03 18 0B 20 1E 0A 0A 08 B9 EA 01 10 01 18 06 20 03 0A 0A 08 BA EA 0110 01 18 12 20 1E 0A 0A 08 BB 9C 01 10 02 18 0B 20 00 0A 0A 08 BB EA 01 10 01 18 0F 20 1E 0A 0A 08 BD 9C 01 10 01 18 01 20 00 0A 0A 08 BE EA 0110 01 18 04 20 14 0A 0A 08 BE 9C 01 10 01 18 01 20 00 0A 0A 08 BF 9C 01 10 01 18 02 20 0A 0A 0A 08 C0 9C 01 10 02 18 0B 20 0A 0A 0A 08 C1 EA 01 10 01 18 0D 20 14 0A 0A 08 C1 9C 01 10 01 18 02 20 00 0A 0A 08 C2 9C 01 10 01 18 01 20 00 0A 0A08 C3 9C 01 10 02 18 0B 20 00 0A 0A 08 C4 EA 01 10 02 18 0B 20 03 0A 0A 08 C4 9C 01 10 01 18 0B 20 00 0A 0A 08 C5 EA 01 10 01 18 0C 20 03 0A 0A 08 C6 EA 01 10 01 18 0B 20 03 0A 0A 08 C7 9C 01 10 01 18 01 20 00 0A 0A 08 C8 9C 01 10 01 18 0B20 00 0A 0A 08 C9 EA 01 10 01 18 0B 20 00 0A 0A 08 CA EA 01 10 01 18 03 20 00 0A 0A 08 CB EA 01 10 01 18 0C 20 00 0A 0A 08 CC 9C 01 10 01 18 0B 20 03 0A 0A 08 CC EA 01 10 01 18 03 20 00 0A 0A 08 CD 9C 01 10 01 18 0B 20 14 0A 0A 08 CD EA 0110 01 18 0B 20 00 0A 0A 08 CE 9C 01 10 01 18 01 20 00 0A 0A 08 CE EA 01 10 01 18 0B 20 00 0A 0A 08 D1 EA 01 10 01 18 0B 20 00 0A 0A 08 D1 9C 01 10 03 18 0B 20 14 0A 0A 08 D2 EA 01 10 02 18 0B 20 14 0A 0A 08 D5 EA 01 10 01 18 01 20 00 0A 0A 08 D7 EA 01 10 01 18 01 20 00 0A 0A 08 D8 EA 01 10 01 18 01 20 14 0A 0A 08 D9 EA 01 10 01 18 05 20 14 0A 0A 08 DA EA 01 10 01 18 01 20 14 0A 0A08 DC EA 01 10 01 18 01 20 1E 0A 0A 08 DE EA 01 10 05 18 09 20 00 62 3F 08 31 10 BC 82 07 18 50 20 04 2A 06 08 A7 BF 05 10 02 2A 06 08 94 BF 05 10 03 2A 06 08 BB BF 05 10 01 2A 06 08 91 BF 05 10 02 30 19 50 01 58 00 60 00 68 00 70 00 80 0101 90 01 00 98 01 01 70 01 92 01 AF 04 0A 06 08 03 10 86 8C 02 0A 06 08 01 10 D7 B7 0A 0A 06 08 02 10 80 A2 71 12 04 08 1B 10 0A 12 04 08 0D 10 70 12 04 08 06 10 19 12 04 08 07 10 05 12 04 08 05 10 46 12 04 08 0A 10 0A 12 05 08 09 10 9F 0312 05 08 0C 10 F8 01 12 04 08 08 10 0A 12 04 08 0F 10 0A 12 04 08 0B 10 7D 12 04 08 0E 10 23 12 04 08 10 10 05 1A 5D 08 01 12 2D 08 CC 02 10 04 18 B4 B6 15 18 9A B6 15 18 B3 B6 15 18 D0 B6 15 20 12 2A 09 E9 81 93 E6 97 A0 E6 9E 81 30 94 4E38 03 42 04 08 09 10 47 1A 2A 10 04 18 C8 B6 15 18 A8 B6 15 18 D0 B6 15 18 BD B6 15 20 0D 2A 09 E8 8A B7 E8 8B A5 E5 85 B0 30 92 4E 38 04 42 04 08 0C 10 38 1A 59 08 02 12 29 08 FE 02 10 03 18 A4 B6 15 18 BC B6 15 18 BA B6 15 20 13 2A 09 E7 99 BD E7 91 B6 E9 9C 9C 30 96 4E 38 04 42 04 08 0C 10 49 1A 2A 10 04 18 DE B6 15 18 9A B6 15 18 BC B6 15 18 B2 B6 15 20 11 2A 09 E4 BA 91 E4 B8AD E9 B9 A4 30 94 4E 38 03 42 04 08 09 10 3E 1A 5D 08 03 12 2D 08 86 03 10 04 18 B4 B6 15 18 CB B6 15 18 BD B6 15 18 A8 B6 15 20 13 2A 09 E4 BA 91 E8 88 92 E9 9B 85 30 94 4E 38 04 42 04 08 0B 10 4C 1A 2A 10 04 18 C8 B6 15 18 D0 B6 15 18 C1B6 15 18 9E B6 15 20 10 2A 09 E7 B4 AB E8 8B B1 E9 80 B8 30 91 4E 38 03 42 04 08 09 10 41 1A 55 08 04 12 29 08 D2 01 10 03 18 A4 B6 15 18 B3 B6 15 18 AE B6 15 20 0F 2A 09 E5 8F A4 E4 BA 95 E5 AD 90 30 94 4E 38 03 42 04 08 09 10 43 1A 26 1003 18 B3 B6 15 18 C1 B6 15 18 99 B6 15 20 0C 2A 09 E4 B8 B9 E6 A2 85 E4 BB 99 30 92 4E 38 04 42 04 08 0C 10 35 1A 55 08 05 12 29 08 F2 02 10 03 18 BD B6 15 18 A3 B6 15 18 C6 B6 15 20 13 2A 09 E9 94 A6 E7 91 9F E9 80 B8 30 96 4E 38 03 42 0408 09 10 42 1A 26 10 03 18 BD B6 15 18 D2 B6 15 18 B2 B6 15 20 0F 2A 09 E9 9C 9C E5 87 9D E5 BD A4 30 92 4E 38 05 42 04 08 0D 10 3E


*/
